const {save, find} = require("../Model/users")
const bcrypt = require('bcrypt')

const regist = async (req, res) => {
    // 1.获取用户传递的用户名和密码
    // 获取用户通过Post请求的数据 req.body
    console.log(req.body);
    let {username, password,email } = req.body
    // 进行非空的验证
    if (!username || !password || !email)  {
        res.send({ state: false, status: 1004, msg: "用户名密码或邮箱错误"})
        return
    }
    // 2.把用户的用户名和密码保存到数据库
    // 先要保证数据中没有这个用户名，要通过用户名进行查找
    // 如果找到了 说明重复了
    const findResult = await find( { username } )
    console.log(findResult);
    if(Array.isArray(findResult)) {
        // 先确保返回的是一个数组，保证数据库查找没有错
        if (findResult.length) {
            res.send({state: false, status: 1004, msg: "存在这个用户名，但不能被注册" })
            return
    } else {

        let hashPsw = await bcrypt.hash(password, 10)
        req.body.password = hashPsw;

        // 可以注册
        let saveRes = await save(req.body);

        // 进行判断 
        if(typeof saveRes === "object") {
            // 返回对象说明注册成功
            res.send({ state: true, status: 200, msg: "注册成功"})
            return
        } else {
            // 注册出错
            res.send( { state: false, status: 1005, msg: saveRes } )
            return
        }
    }
    } else {
        res.send( { state: false, status: 1005, msg: findResult} )
        return
    }
}


const login = async (req, res) => {
    // 1.获取用户传入的用户名和用户密码
    let { username, password , email} = req.body
    // 进行非空的验证
    if (!username || !password || !email) {
        res.send({ state: false, status: 1004, msg: "用户名和密码不能为空"})
        return
    }
    // 2.通过用户名和用户密码到数据库查找，如果存在，登入成功，如果不存在则登录失败
    // 首先要用过用户名，查找到当前数据，将加密之后的hash取出来，和传入的密码进行对比
    let findRes = await find({ username });
    let ema = await find({ email });
    if(Array.isArray(findRes,ema)) {
        // 如果findRes这个数组有长度，说明存在这个用户，那么将hash密码从数据库中取出和传入的密码进行对比了
        if (findRes.length) {
            // console.log(findRes);
            // 取出来加密之后的密码
            let hashPsw = findRes[0].password;
            // 调用bcrypt的对比方法
            let match = await bcrypt.compare(password,hashPsw)
            
            if(ema.length) {
                if(match) {
                    // 密码比对成功返回登录成功，不明感的学习可以返回用户
                    let data = {
                        _id: findRes[0]._id,
                        openid: findRes[0].openid,
                        username:findRes[0].username,
                        email:findRes[0].email || "",
                        gnder:findRes[0].gnder || "",
                        nickmane: findRes[0].nickmane || "",
                    }
                    res.send({state: true, status: 200, msg: "登录成功", data})
                } else {
                    res.send({state: true, status: 200, msg: "用户名和密码或邮箱错误"})
                    
                }
            } else {
                res.send({state: true, status: 200, msg: "用户名和密码或邮箱错误"})
                
            }
        } else {
            res.send({state: false, status: 1004, msg: "用户名不存在"})
        }
        //如果findeRes这个数组没有长度，说明数据库中不存在这个用户，那么要返回错误信息给客户端 
    } else {
        // 查询出错，响应错误
        res.send( { state: false, status: 1005, msg: findRes} )
        return
    }
    //res.send("111");
}

module.exports ={ 
    regist,
    login
}